﻿using BLevy.Entidad;
using BLevy.Negocio;
using BLevy.UI.Utils;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace BLevy.UI
{
    public partial class frmCuponesImpresionParcial : Form
    {
        private ImpresionCupones impresion;
        public frmCuponesImpresionParcial()
        {
            InitializeComponent();
        }

        private void btnSalir_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void IniciarControles()
        {
            txtNumeroDesde.Text = string.Empty;
            txtNumeroHasta.Text = string.Empty;

            txtNumeroHasta.Enabled = false;
            txtNumeroDesde.Enabled = false;
            cmbLocalidades.Enabled = false;
            cmbZonas.Enabled = false;

            txtNroCertDesde.Enabled = false;
            txtNroCertHasta.Enabled = false;

            txtLetraDesde.Enabled = false;
            txtLetraHasta.Enabled = false;
        }

        private void frmCuponesImpresionParcial_Load(object sender, EventArgs e)
        {
            IniciarControles();
            GetLocalidades();
        }

        private void GetLocalidades()
        {
            try
            {
                cmbLocalidades.ValueMember = "id";
                cmbLocalidades.DisplayMember = "localidad";
                cmbLocalidades.DataSource = Localidades.FindAll();

                if (cmbLocalidades.Items.Count != 0)
                {
                    GetZonasPorLocalidad(Convert.ToInt32(cmbLocalidades.SelectedValue));
                }
                else
                {
                    cmbZonas.DataSource = null;
                }
            }
            catch (Exception e)
            {
                MessageBox.Show("Error : " + e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void GetZonasPorLocalidad(int localidad_id)
        {
            try
            {
                cmbZonas.DisplayMember = "zona";
                cmbZonas.ValueMember = "id";
                cmbZonas.DataSource = Negocio.Zonas.FindAllPorLocalidad(localidad_id);
            }
            catch (Exception e)
            {
                MessageBox.Show("Error : " + e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void cmbLocalidades_SelectionChangeCommitted(object sender, EventArgs e)
        {
            GetZonasPorLocalidad(Convert.ToInt32(cmbLocalidades.SelectedValue));
        }

        private void ckbNumeracion_CheckedChanged(object sender, EventArgs e)
        {
            error.Clear();
            txtNumeroDesde.Text = string.Empty;
            txtNumeroHasta.Text = string.Empty;

            if (ckbNumeracion.CheckState == CheckState.Checked)
            {
                txtNumeroDesde.Enabled = true;
                txtNumeroHasta.Enabled = true;
            }
            else
            {
                txtNumeroDesde.Enabled = false;
                txtNumeroHasta.Enabled = false;
            }
        }

        private void ckbLocalidad_CheckedChanged(object sender, EventArgs e)
        {
            error.Clear();
            cmbLocalidades.SelectedIndex = 0;
            cmbZonas.SelectedIndex = 0;

            if (ckbLocalidad.CheckState == CheckState.Checked)
            {
                cmbLocalidades.Enabled = true;
                cmbZonas.Enabled = true;
            }
            else
            {
                cmbLocalidades.Enabled = false;
                cmbZonas.Enabled = false;
            }
        }

        private void ckbCert_CheckedChanged(object sender, EventArgs e)
        {
            error.Clear();
            txtNroCertDesde.Text = string.Empty;
            txtNroCertHasta.Text = string.Empty;

            if (ckbCert.CheckState == CheckState.Checked)
            {
                txtNroCertDesde.Enabled = true;
                txtNroCertHasta.Enabled = true;
            }
            else
            {
                txtNroCertHasta.Enabled = false;
                txtNroCertDesde.Enabled = false;
            }
        }

        private void ckbAlfabetico_CheckedChanged(object sender, EventArgs e)
        {
            error.Clear();
            txtLetraDesde.Text = string.Empty;
            txtLetraHasta.Text = string.Empty;

            if (ckbAlfabetico.CheckState == CheckState.Checked)
            {
                txtLetraDesde.Enabled = true;
                txtLetraHasta.Enabled = true;
            }
            else
            {
                txtLetraDesde.Enabled = false;
                txtLetraHasta.Enabled = false;
            }
        }

        private void btnImprimir_Click(object sender, EventArgs e)
        {
            if (ValidarForm() == true)
            {
                //FiltrarForm(Convert.ToInt32("0" + txtNroCertDesde.Text), Convert.ToInt32("0" + txtNroCertHasta.Text),
                //    Convert.ToInt32(cmbLocalidades.SelectedValue), Convert.ToInt32(cmbZonas.SelectedValue),
                //    txtLetraDesde.Text, txtLetraHasta.Text, txtNumeroDesde.Text, txtNumeroHasta.Text);

                FiltrarImpresion();
            }
        }

        private Boolean ValidarForm()
        {
            error.Clear();
            bool resultado = true;

            //if(ckbAlfabetico.Checked == true)
            //{
            //    if(string.IsNullOrEmpty(txtLetraDesde.Text))
            //    {
            //        resultado = false;
            //        error.SetError(txtLetraDesde, "Debe completar el campo Letra Desde.");
            //        return resultado;
            //    }
            //    if(string.IsNullOrEmpty(txtLetraHasta.Text))
            //    {
            //        resultado = false;
            //        error.SetError(txtLetraHasta, "Debe completar el campo Letra Hasta.");
            //        return resultado;
            //    }
            //}

            if (ckbCert.Checked == true)
            {
                if (string.IsNullOrEmpty(txtNroCertDesde.Text))
                {
                    resultado = false;
                    error.SetError(txtNroCertDesde, "Debe completar el campo Nro. Cert. Desde.");
                    return resultado;
                }
                if (string.IsNullOrEmpty(txtNroCertHasta.Text))
                {
                    resultado = false;
                    error.SetError(txtNroCertHasta, "Debe completar el campo Nro. Cert. Hasta.");
                    return resultado;
                }
            }

            if (ckbNumeracion.Checked == true)
            {
                if (string.IsNullOrEmpty(txtNumeroDesde.Text))
                {
                    resultado = false;
                    error.SetError(txtNumeroDesde, "Debe completar el campo Nro. Cupón Desde.");
                    return resultado;
                }
                if (string.IsNullOrEmpty(txtNumeroHasta.Text))
                {
                    resultado = false;
                    error.SetError(txtNumeroHasta, "Debe completar el campo Nro. Cupón Hasta.");
                    return resultado;
                }
            }

            return resultado;
        }

        //private void FiltrarForm(int nroCertDesde, int nroCertHasta, int localidad_id, int zona_id, string letraDesde, string letraHasta, string nroCuponDesde, string nroCuponHasta)
        //{
        //    char? letra_desde = null;
        //    char? letra_hasta = null;

        //    if(!string.IsNullOrEmpty(letraDesde))
        //        letra_desde = Convert.ToChar(letraDesde);

        //    if (!string.IsNullOrEmpty(letraHasta))
        //        letra_hasta = Convert.ToChar(letraHasta);

        //    if(ckbAlfabetico.Checked == true)
        //    {

        //        letra_hasta = ++letra_hasta;

        //        IList<Cupon> cuponesL = Cupones.GetAllCuponesAImprimir().Where
        //            (x => (x.socio.apellido.CompareTo(letra_desde.ToString()) >= 0) && 
        //                (x.socio.apellido.CompareTo(letra_hasta.ToString()) <= 0)).ToList();

        //        impresion = new ImpresionCupones(cuponesL);
        //        impresion.Imprimir();
        //    }

        //    if(ckbLocalidad.Checked == true)
        //    {
        //        IList<Cupon> cuponesL = Cupones.GetAllCuponesAImprimir().Where(x => x.socio.localidad_id == localidad_id && x.socio.zona_id == zona_id).ToList();
        //        impresion = new ImpresionCupones(cuponesL);
        //        impresion.Imprimir();
        //    }

        //    if(ckbCert.Checked == true)
        //    {
        //        IList<Cupon> cuponesL = Cupones.GetAllCuponesAImprimir().Where
        //            (x => Convert.ToInt32(x.socio.numero_certificado) >= nroCertDesde && 
        //                Convert.ToInt32(x.socio.numero_certificado) <= nroCertHasta).ToList();
        //        impresion = new ImpresionCupones(cuponesL);
        //        impresion.Imprimir();
        //    }

        //    if(ckbNumeracion.Checked == true)
        //    {
        //        string cupon_inicial = txtNumeroDesde.Text;
        //        string cupon_final = txtNumeroHasta.Text;

        //        IList<Cupon> cuponesL = Cupones.GetAllCuponesAImprimir().Where(x => String.Compare(x.numero, cupon_inicial) >= 0 && 
        //            String.Compare(x.numero, cupon_final) <= 0).ToList();
        //        impresion = new ImpresionCupones(cuponesL);
        //        impresion.Imprimir();
        //    }
        //}

        private void txtNroCertDesde_KeyPress(object sender, KeyPressEventArgs e)
        {
            error.Clear();
            if (!(char.IsNumber(e.KeyChar)) && (e.KeyChar != (char)Keys.Back))
            {
                error.SetError(txtNroCertDesde, "Solo se permiten números en el campo Nro. Cert. Desde.");
                e.Handled = true;
                return;
            }
        }

        private void txtNroCertHasta_KeyPress(object sender, KeyPressEventArgs e)
        {
            error.Clear();
            if (!(char.IsNumber(e.KeyChar)) && (e.KeyChar != (char)Keys.Back))
            {
                error.SetError(txtNroCertHasta, "Solo se permiten números en el campo Nro. Cert. Hasta.");
                e.Handled = true;
                return;
            }
        }

        private void txtNumeroDesde_KeyPress(object sender, KeyPressEventArgs e)
        {
            error.Clear();
            if (!(char.IsNumber(e.KeyChar)) && (e.KeyChar != (char)Keys.Back) && (e.KeyChar != '-'))
            {
                error.SetError(txtNumeroDesde, "Solo se permiten números en el campo Nro. Cupón Desde.");
                e.Handled = true;
                return;
            }
        }

        private void txtNumeroHasta_KeyPress(object sender, KeyPressEventArgs e)
        {
            error.Clear();
            if (!(char.IsNumber(e.KeyChar)) && (e.KeyChar != '-') && (e.KeyChar != (char)Keys.Back))
            {
                error.SetError(txtNumeroHasta, "Solo se permiten números en el campo Nro. Cupón Hasta.");
                e.Handled = true;
                return;
            }
        }

        private void txtLetraHasta_KeyPress(object sender, KeyPressEventArgs e)
        {
            error.Clear();
            if (!(char.IsLetter(e.KeyChar)) && (e.KeyChar != '-') && (e.KeyChar != (char)Keys.Back))
            {
                error.SetError(txtLetraHasta, "Solo se permiten letras en el campo Letra Hasta.");
                e.Handled = true;
                return;
            }
        }

        private void txtLetraDesde_KeyPress(object sender, KeyPressEventArgs e)
        {
            error.Clear();
            if (!(char.IsLetter(e.KeyChar)) && (e.KeyChar != '-') && (e.KeyChar != (char)Keys.Back))
            {
                error.SetError(txtLetraDesde, "Solo se permiten letras en el campo Letra Desde.");
                e.Handled = true;
                return;
            }
        }


        private void FiltrarImpresion()
        {
            string certificado_desde = txtNroCertDesde.Text == string.Empty ? null : txtNroCertDesde.Text;
            string certificado_hasta = txtNroCertHasta.Text == string.Empty ? null : txtNroCertHasta.Text;

            int? localidad_id = ckbLocalidad.Checked ? (int?)cmbLocalidades.SelectedValue : null;
            int? zona_id = ckbLocalidad.Checked ? (int?)cmbZonas.SelectedValue : null;

            string letra_desde = txtLetraDesde.Text == string.Empty ? null : txtLetraDesde.Text;
            string letra_hasta = txtLetraHasta.Text == string.Empty ? null : txtLetraHasta.Text;

            string cupon_desde = txtNumeroDesde.Text == string.Empty ? null : txtNumeroDesde.Text;
            string cupon_hasta = txtNumeroHasta.Text == string.Empty ? null : txtNumeroHasta.Text;

            //convierto a char para sumarle una letra a la busqueda
            char? letrahasta = null;
            if (letra_hasta != null)
            {
                if (letra_hasta.ToUpper() == "Z")
                {
                    letra_hasta = "Y";
                }
                letrahasta = Convert.ToChar(letra_hasta);
                letrahasta = ++letrahasta;

                letra_hasta = letrahasta.ToString();
            }

            try
            {
                IList<Cupon> cuponesL = Cupones.FindAllImpresionParcial(certificado_desde, certificado_hasta, localidad_id, zona_id,
                    letra_desde, letra_hasta, cupon_desde, cupon_hasta);

                if (ckbAlfabetico.CheckState == CheckState.Checked && txtLetraDesde.Text == string.Empty
                    && txtLetraHasta.Text == string.Empty)
                    cuponesL.OrderBy(x => x.socio.apellido);

                if (cuponesL.Count != 0)
                {
                    impresion = new ImpresionCupones(cuponesL);
                    impresion.Imprimir();
                }
            }
            catch (Exception e)
            {
                MessageBox.Show("Error : " + e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    }
}
